home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / etc / getopt.c < prev    next >
C/C++ Source or Header  |  1990-02-14  |  2KB  |  87 lines

  1. /*
  2.  * Copyright (c) 1987 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms are permitted
  6.  * provided that this notice is preserved and that due credit is given
  7.  * to the University of California at Berkeley. The name of the University
  8.  * may not be used to endorse or promote products derived from this
  9.  * software without specific written prior permission. This software
  10.  * is provided ``as is'' without express or implied warranty.
  11.  */
  12.  
  13. #if defined(LIBC_SCCS) && !defined(lint)
  14. static char sccsid[] = "@(#)getopt.c    4.6 (Berkeley) 4/19/88";
  15. #endif /* LIBC_SCCS and not lint */
  16.  
  17. #include <stdio.h>
  18.  
  19. /*
  20.  * get option letter from argument vector
  21.  */
  22. int    opterr = 1,        /* if error message should be printed */
  23.     optind = 1,        /* index into parent argv vector */
  24.     optopt;            /* character checked for validity */
  25. char    *optarg;        /* argument associated with option */
  26.  
  27. #define    BADCH    (int)'?'
  28. #define    EMSG    ""
  29. #define    tell(s)    { \
  30.     if (opterr) { \
  31.         fputs(*nargv, stderr); \
  32.         fputs(s, stderr); \
  33.         fputc(optopt, stderr); \
  34.         fputc((int)'\n', stderr); \
  35.     } \
  36.     return(BADCH); \
  37. }
  38.  
  39. getopt(nargc, nargv, ostr)
  40.     int nargc;
  41.     char **nargv, *ostr;
  42. {
  43.     static char *place = EMSG;        /* option letter processing */
  44.     register char *oli;            /* option letter list index */
  45.     static char **lastargv;
  46.     char *index();
  47.  
  48.     if (!*place) {                /* update scanning pointer */
  49.             lastargv = nargv;
  50.     } else if (lastargv != nargv) {
  51.             place = EMSG;
  52.         lastargv = nargv;
  53.     }    
  54.     if (!*place) {                /* update scanning pointer */
  55.         if (optind >= nargc || *(place = nargv[optind]) != '-')
  56.             return(EOF);
  57.         if (place[1] && *++place == '-') {    /* found "--" */
  58.             ++optind;
  59.             return(EOF);
  60.         }
  61.     }                     /* option letter okay? */
  62.     if ((optopt = (int)*place++) == (int)':' ||
  63.         !(oli = index(ostr, optopt))) {
  64.         if (!*place)
  65.             ++optind;
  66.         tell(": illegal option -- ");
  67.     }
  68.     if (*++oli != ':') {            /* don't need argument */
  69.         optarg = NULL;
  70.         if (!*place)
  71.             ++optind;
  72.     }
  73.     else {                    /* need an argument */
  74.         if (*place)            /* no white space */
  75.             optarg = place;
  76.         else if (nargc <= ++optind) {    /* no arg */
  77.             place = EMSG;
  78.             tell(": option requires an argument -- ");
  79.         }
  80.          else                /* white space */
  81.             optarg = nargv[optind];
  82.         place = EMSG;
  83.         ++optind;
  84.     }
  85.     return(optopt);                /* dump back option letter */
  86. }
  87.